from django.shortcuts import get_object_or_404, render
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
from listings.choices import price_choices, bedroom_choices, state_choices    #和主页中的检索表单一样，需要引入已经编写好的 choices.py 中的字典数据结构来优化代码。
from .models import Listing


def index(request):
    listings = Listing.objects.order_by('-list_date').filter(is_published=True)   

    paginator = Paginator(listings, 6)
    page = request.GET.get('page')
    paged_listings = paginator.get_page(page)

    context = {
        'listings': paged_listings
    }

    return render(request,'listings/listings.html',context)


def listing(request, listing_id):
    listing = get_object_or_404(Listing, pk=listing_id)  #使用 get_object_or_404() 方法，该方法需要传入两个参数，第一个参数为 model，第二个参数为 Primary Key.

    context = {
        'listing':listing
    }

    return render(request,'listings/listing.html',context)


def search(request):   #传入网页模板。
    queryset_list = Listing.objects.order_by('-list_date')  #定义变量 queryset_list用于存放检索后的数据。

    # Keywords
    if 'keywords' in request.GET:
        keywords = request.GET['keywords']
        if keywords:
            queryset_list = queryset_list.filter(    #filter的条件，description__icontains=keywords 表示只要简介项目包含关键词就返回 True，而不是必须完全一致。
                description__icontains=keywords)

    # City   同样的逻辑实现城市名的检索。
    if 'city' in request.GET:
        city = request.GET['city']
        if city:
            queryset_list = queryset_list.filter(    #filter() 的检索条件为，city__iexact=city，表示必须完全匹配才返回 True
                city__iexact=city)

    # State   同样的逻辑实现 State 的检索。
    if 'state' in request.GET:
        state = request.GET['state']
        if state:
            queryset_list = queryset_list.filter(    #filter() 的检索条件为，city__iexact=city，表示必须完全匹配才返回 True
                state__icontains=state)

     # Bedrooms
    if 'bedrooms' in request.GET:
        bedrooms = request.GET['bedrooms']
        if bedrooms:
            queryset_list = queryset_list.filter(    #注意这里的 filter() 的检索条件为 bedrooms_lte=bedrooms，lte是小于或等于的意思，所以检索的结果是返回小于或等于用户选择的卧室数量的房产。
                bedrooms__lte=bedrooms)

    # Price
    if 'price' in request.GET:
        price = request.GET['price']
        if price:
            queryset_list = queryset_list.filter(
                price__lte=price)
                        
    context = {
        'state_choices': state_choices,
        'bedroom_choices': bedroom_choices,
        'price_choices': price_choices,
        'listings': queryset_list,
        'values': request.GET
    }

    return render(request,'listings/search.html',context)
